// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/browser/ui/page_info/page_info_permissions_mediator.h"

#import "ios/chrome/browser/ui/permissions/permission_info.h"
#import "ios/web/public/permissions/permissions.h"
#import "ios/web/public/test/fakes/fake_web_state.h"
#import "testing/gtest/include/gtest/gtest.h"
#import "testing/platform_test.h"

// Tests for Permissions mediator for the page info.
class PageInfoPermissionsTest : public PlatformTest {
 protected:
  PageInfoPermissionsTest() {}

  ~PageInfoPermissionsTest() override { [mediator_ disconnect]; }

  void SetUp() override {
    PlatformTest::SetUp();
    fake_web_state_ = std::make_unique<web::FakeWebState>();
    web::WebState* web_state_ = fake_web_state_.get();

    // Initialize camera state to Allowed but keeps microphone state
    // NotAccessible.
    web_state_->SetStateForPermission(web::PermissionStateAllowed,
                                      web::PermissionCamera);
    web_state_->SetStateForPermission(web::PermissionStateNotAccessible,
                                      web::PermissionMicrophone);

    mediator_ =
        [[PageInfoPermissionsMediator alloc] initWithWebState:web_state_];
  }

  PageInfoPermissionsMediator* mediator() { return mediator_; }

  web::WebState* web_state() { return fake_web_state_.get(); }

 private:
  std::unique_ptr<web::FakeWebState> fake_web_state_;
  PageInfoPermissionsMediator* mediator_;
};

// Verifies that `updateStateForPermission:` updates correctly the web state
// permission.
TEST_F(PageInfoPermissionsTest, TestUpdateStateForPermission) {
  PermissionInfo* permissionDescription = [[PermissionInfo alloc] init];
  permissionDescription.permission = web::PermissionCamera;
  permissionDescription.state = web::PermissionStateBlocked;

  [mediator() updateStateForPermission:permissionDescription];
  ASSERT_EQ(web_state()->GetStateForPermission(web::PermissionCamera),
            web::PermissionStateBlocked);
}
